#ifndef _RFID_BOARD_H_
#define _RFID_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if _RFID_FUNCTION_ENABLE_

/* 定义相关驱动引脚 */
#if _BOARD_TYPE_ == _V31_A_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_14
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_15
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_3
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_2
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_1
// 检测
#define RFID_IRQN_PIN                                       GPIO_Pin_13

#elif _BOARD_TYPE_ == _V32_A_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_14
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_15
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_3
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_2
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_1
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_13

#elif _BOARD_TYPE_ == _V32_B_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_18
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_19
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_20
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_21
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_0
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_6

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_11
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_10
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_7
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_6
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_5
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_12

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_15
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_16
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_17
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_8
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_9
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_7

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_1
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_0
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_6
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_5
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_4
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_2

#elif _BOARD_TYPE_ == _DA01_A_BOARD_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_2
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_13
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_14
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_15
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_1
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_3

#elif _BOARD_TYPE_ == _CR01_BU_
// SPI 片选
#define RFID_SPI_NSS_PIN                                    GPIO_Pin_1 //PA1
// SPI 时钟
#define RFID_SPI_SCK_PIN                                    GPIO_Pin_0 //PA0
// SPI 数据输入
#define RFID_SPI_MOSI_PIN                                   GPIO_Pin_6 //PB13
// SPI 数据输出
#define RFID_SPI_MISO_PIN                                   GPIO_Pin_5 //PA5
// 复位
#define RFID_DEVICE_RESET_PIN                               GPIO_Pin_4 //PB15
// 中断
#define RFID_IRQN_PIN                                       GPIO_Pin_2 //PB10
#endif

// 卡号长度
#define RFID_NUMBER_OF_MIFARE_CARD_SERIAL_NUMBER            (4ul)
// 卡号长度
#define RFID_NUMBER_OF_CARD_SERIAL_NUMBER                   (USER_AUTHENTICATION_KEY_LENGTH)
// 加密后密钥最大长度
#define RFID_MAX_NUMBER_OF_CODED_TEXT                       (16ul)
// 扇区最大操作数据长度
#define RFID_MAX_LENGTH_OF_OPERATION_DATA                   (NOMINAL_PACKET_LENGTH)

// 定义读卡间隔时间
#define RFID_DEFAULT_CARD_DETECTION_INTERVAL_TIME           (1ul)

/**
 * @brief 识读卡片类型
 *
 */
typedef enum
{
  MIFARE_CARD_MODE,        // MIFARE
  STANDBY_CPU_MODE,        // CPU
  _2RD_GENERATION_ID_CARD, // 身份证
} RfidReadCard_t;

/**
 * @brief 卡片协议
 *
 */
typedef enum
{
  RFID_CARD_PROTOCOL_YG, // 杨格协议
  RFID_CARD_PROTOCOL_HZ, // 华住协议
} RfidCardProtocol_t;

/**
 * @brief 卡类型
 *
 */
typedef enum
{
  RFID_CALIBRATION_TIME_CARD      = 0x10, // 时间校准卡
  RFID_GUEST_ROOM_CARD            = 0x11, // 宾客房卡
  RFID_MASTER_ROOM_CARD           = 0x12, // 总卡
  RFID_BUILDING_CARD              = 0x13, // 楼栋卡
  RFID_FLOOR_CARD                 = 0x14, // 楼层卡
  RFID_PARK_CARD                  = 0x15, // 园区卡
  RFID_INSTALL_CARD               = 0x16, // 安装卡
  RFID_VIRTUAL_CARD_SERIAL_NUMBER = 0x17, // 虚拟卡
  RFID_CLEAR_CARD                 = 0x18, // 清除卡
  RFID_NORMAL_OPEN_CARD           = 0x19, // 常开卡
} OfflineCardType_t;

/**
 * @brief 离线卡操作状态
 *
 */
typedef enum
{
  OFFLINE_CARD_AUTHECTICATION_ERROR,   // 鉴权失败
  OFFLINE_CARD_AUTHENTICATION_SUCCESS, // 鉴权成功
  OFFLINE_CARD_FORBIDDEN,              // 持卡人已禁用
  OFFLINE_CARD_OUT_OF_DATE,            // 不在有效期内
} OfflineCardOperationStatus_t;

/**
 * @brief 事件类型
 *
 */
typedef enum
{
  RFID_SELF_TEST        = 1 << 0, // 设备自检
  RFID_READ_CARD_DATA   = 1 << 1, // 读卡数据操作
  RFID_CARD_DATA_UPDATA = 1 << 2, // 卡数据更新操作
  RFID_READ_CARD_DATA_TWO = 1 << 3, // 读卡数据操作2
} RfidTaskEvent_t;

// 设备自检任务回调
typedef void (*RfidSelfTestTask_t)(void);
// 读取卡数据任务回调
typedef void (*RfidReadCardDataTask_t)(void);
// 定时检卡回调
typedef bool (*RfidCardDetectionTask_t)(void);
// 写卡数据任务回调
typedef void (*RfidCardDataUpdateTask_t)(void);

/**
 * @brief 外部调用方法
 *
 */
typedef struct
{
  RfidSelfTestTask_t SelfTestTask;             // 自检回调
  RfidReadCardDataTask_t ReadCardDataTask;     // 读卡回调
  RfidReadCardDataTask_t ReadCardData2Task;     // 读卡2回调
  RfidCardDetectionTask_t CardDetectionTask;   // 检卡回调
  RfidCardDataUpdateTask_t CardDataUpdateTask; // 写卡回调
} RfidExternFunctionTable_t;

/**
 * @brief 使能中断输入
 *
 */
extern void RfidEnableInterrupt(void);

/**
 * @brief 禁用中断输入
 *
 */
extern void RfidDisableInterrupt(void);

/**
 * @brief 微秒延时
 *
 * @param Us - 延时的时间
 */
extern void RfidDelayUs(uint16_t Us);

/**
 * @brief 毫秒延时
 *
 * @param Ms - 延时的时间
 */
extern void RfidDelayMs(uint16_t Ms);

/**
 * @brief 获取 MISO 管脚电平状态
 *
 * @return bool - 管脚电平状态（true：高电平 false：低电平）
 */
extern bool RfidGetMisoPinLevel(void);

/**
 * @brief 设置 MOSI 管脚电平状态
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void RfidSetMosiPinLevel(bool PinLevel);

/**
 * @brief 设置 SCK 管脚电平状态
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void RfidSetSckPinLevel(bool PinLevel);

/**
 * @brief 设置芯片片选管脚电平
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void RfidSetNssPinLevel(bool PinLevel);

/**
 * @brief 设置复位管脚电平状态
 *
 * @param PinLevel - 管脚电平状态（true：高电平 false：低电平）
 */
extern void RfidSetResetPinLevel(bool PinLevel);

/**
 * @brief 硬件复位
 *
 */
extern void RfidHardwareReset(void);

/**
 * @brief 获取设备激活状态
 *
 * @return bool - 激活状态（true：激活 false: 未激活）
 */
extern bool RfidGetDeviceActivationStatus(void);

/**
 * @brief 获取允许开反锁使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool RfidGetAllowedToOpenDoubleLock(void);

/**
 * @brief 获取常开使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool RfidGetNormalOpenEn(void);

/**
 * @brief 获取识读卡类型
 *
 * @return RfidReadCard_t - 卡类型
 */
extern RfidReadCard_t RfidGetReaderCardType(void);

/**
 * @brief 获取卡片识读协议
 *
 * @return RfidCardProtocol_t - 卡协议
 */
extern RfidCardProtocol_t RfidGetCardReadingProtocol(void);

/**
 * @brief 获取验证开锁时间标识位
 *
 * @return uint8_t - 使能标识
 */
extern bool RfidGetValidationStartTimeEnableFlag(void);

/**
 * @brief 获取操作起始扇区号
 *
 * @return uint8_t - 起始扇区编码
 */
extern uint8_t RfidGetStartSectorNumber(void);

/**
 * @brief 获取扇区访问密钥
 *
 * @param pKey - 访问密钥
 */
extern void RfidGetSectorAccessKey(uint8_t *pKey);

/**
 * @brief 设置时区
 *
 * @param TimeZone - 时区
 * @return bool    - 设置状态（true：成功 false：失败）
 */
extern bool RfidSetTimeZone(uint8_t TimeZone);

/**
 * @brief 获取园区号
 *
 * @return uint8_t - 园区号
 */
extern uint8_t RfidGetGardenNumber(void);

/**
 * @brief 获取楼栋编码
 *
 * @return uint8_t - 楼栋编码
 */
extern uint8_t RfidGetBuildNumber(void);

/**
 * @brief 获取楼层编码
 *
 * @return uint8_t - 楼层编码
 */
extern uint8_t RfidGetFloorNumber(void);

/**
 * @brief 获取房间编码
 *
 * @return uint32_t - 房间编码
 */
extern uint32_t RfidGetRoomNumber(void);

/**
 * @brief 获取子房间编码
 *
 * @return uint8_t - 子房间编码
 */
extern uint8_t RfidGetChildRommNumber(void);

/**
 * @brief 获取房间类型
 *
 * @return uint16_t - 房间类型
 */
extern uint16_t RfidGetRoomType(void);

/**
 * @brief 获取分组号
 *
 * @return uint32_t - 分组号
 */
extern uint32_t RfidGetGroupingNumber(void);

/**
 * @brief 获取宾客卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetGuestCardReplaceId(void);

/**
 * @brief 设置宾客卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetGuestCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取总卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetMasterCardReplaceId(void);

/**
 * @brief 设置总卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetMasterCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼栋卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetBuildCardReplaceId(void);

/**
 * @brief 设置楼栋卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetBuildCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼层卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetFloorCardReplaceId(void);

/**
 * @brief 设置楼层卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetFloorCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取园区卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetParkCardReplaceId(void);

/**
 * @brief 设置园区卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetParkCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取常开卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t RfidGetNormalOpenCardReplaceId(void);

/**
 * @brief 设置常开卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 */
extern void RfidSetNormalOpenCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取宾客卡顶替时间
 *
 * @return uint32_t - 顶替时间
 */
extern uint32_t RfidGetGuestCardReplaceTime(void);

/**
 * @brief 设置宾客卡顶替时间
 *
 * @param Time - 顶替时间
 */
extern void RfidSetGuestCardReplaceTime(uint32_t Time);

/**
 * @brief 获取总卡顶替时间
 *
 * @return uint32_t - 顶替时间
 */
extern uint32_t RfidGetMasterCardReplaceTime(void);

/**
 * @brief 设置总卡顶替时间
 *
 * @param Time - 顶替时间
 */
extern void RfidSetMasterCardReplaceTime(uint32_t Time);

/**
 * @brief 获取楼栋卡顶替时间
 *
 * @return uint32_t - 顶替时间
 */
extern uint32_t RfidGetBuildCardReplaceTime(void);

/**
 * @brief 设置楼栋卡顶替时间
 *
 * @param Time - 顶替时间
 */
extern void RfidSetBuildCardReplaceTime(uint32_t Time);

/**
 * @brief 获取楼层卡顶替时间
 *
 * @return uint32_t - 顶替时间
 */
extern uint32_t RfidGetFloorCardReplaceTime(void);

/**
 * @brief 设置楼层卡顶替时间
 *
 * @param Time - 顶替时间
 */
extern void RfidSetFloorCardReplaceTime(uint32_t Time);

/**
 * @brief 获取园区卡顶替时间
 *
 * @return uint32_t - 顶替时间
 */
extern uint32_t RfidGetParkCardReplaceTime(void);

/**
 * @brief 设置园区卡顶替时间
 *
 * @param Time - 顶替时间
 */
extern void RfidSetParkCardReplaceTime(uint32_t Time);

/**
 * @brief 获取设置常开卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t RfidGetNormalOpenCardReplaceTime(void);

/**
 * @brief 设置设置常开卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern void RfidSetNormalOpenCardReplaceTime(uint32_t Time);

/**
 * @brief 获取鉴权时间判断允许误差
 *
 * @return uint8_t - 误差系数
 */
extern uint8_t RfidGetAllowableTimeError(void);

/**
 * @brief 更新系统参数
 *
 */
extern void RfidUpdateDeviceParameters(void);

/**
 * @brief 判断是否处于常开模式
 *
 * @return bool - 常开状态（true：是 false：否）
 */
extern bool RfidDetermineWhetherItIsInTheNormallyOpenState(void);

/**
 * @brief 获取设备释放处于活跃状态
 *
 * @return bool - 活跃状态（true：是 false：否）
 */
extern bool RfidGetDeviceActiveStatus(void);

/**
 * @brief 启动自检启动音效
 *
 */
extern void RfidPlayStartSelfTestSound(void);

/**
 * @brief 退出自检音效
 *
 */
extern void RfidPlayExitSelfTestSound(void);

/**
 * @brief 播放设置状态
 *
 * @param Status - 状态(true:成功 false:失败)
 */
extern void RfidPlaySettingStatusAudio(bool Status);

/**
 * @brief 获取读卡灵敏度
 *
 * @return uint8_t - 灵敏度
 */
extern uint8_t RfidGetCardReadingSensitivity(void);

/**
 * @brief 获取宾客卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetGuestCardEn(void);

/**
 * @brief 设置总卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetMasterCardEn(void);

/**
 * @brief 获取楼栋卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetBuildCardEn(void);

/**
 * @brief 获取楼层卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetFloorCardEn(void);

/**
 * @brief 获取园区卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetParkCardEn(void);

/**
 * @brief 获取常开卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool RfidGetNormalOpenCardEn(void);

/**
 * @brief 写校时卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteCalibrationCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写宾客卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteGuestCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写总卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteMasterCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写楼栋卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteBuildCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写楼层卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteFloorCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写园区卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteParkCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写保洁卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteClearCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写清除卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteClearParameterCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 写安装卡日志
 *
 * @param pCardNumberIn - 卡号
 * @param NumberOfCard  - 卡号长度
 * @param Status        - 验证状态
 */
extern void RfidWriteInstallCardNumberLog(const void *pCardNumberIn, const uint8_t NumberOfCard, const uint8_t Status);

/**
 * @brief 获取设备繁忙状态
 *
 * @return bool - 设备繁忙状态（true：繁忙 false：空闲）
 */
extern bool RfidGetDeviceBusyEn(void);

/**
 * @brief 本地注册前的准备
 *
 */
extern void RfidPreparationsBeforeLocalRegister(void);

/**
 * @brief 提示设备反锁方法
 *
 */
extern void RfidHintAntiLockHandler(void);

/**
 * @brief 提示卡片顶替方法
 *
 */
extern void RfidHintCardRepaceErrorHandler(void);

/**
 * @brief 提示卡片不在有效期方法
 *
 */
extern void RfidHintCardOutOfDateHanlder(void);

/**
 * @brief 提示鉴权失败方法
 *
 */
extern void RfidHintAuthenticationErrorHanlder(void);

/**
 * @brief 提示卡片归属出错方法
 *
 */
extern void RfidCardAffiliationErrorHanlder(void);

/**
 * @brief 提示该功能卡已禁用方法
 *
 */
extern void RfidThisFunctionCardHasBeenDisabledHanlder(void);

/**
 * @brief 提示鉴权成功方法
 *
 * @param CardType            - 卡类型
 * @param pCardSerialNumberIn - 卡号
 * @param NormalOpenEn        - 常开标识（true：常开 false：回锁）
 */
extern void RfidHintAuthenticationSuccessHanlder(uint8_t CardType, const uint8_t *pCardSerialNumberIn, bool NormalOpenEn);

/**
 * @brief 获取反锁信号触发标识
 *
 * @return bool - 触发标识（true：触发 false：静默）
 */
extern bool RfidGetDoubleLockEn(void);

/**
 * @brief 获取等待用户动作标志
 *
 * @return bool - 用户动作标志（true：正在进行 false：空闲）
 */
extern bool RfidGetWaitUserActionEn(void);

/**
 * @brief 获取实时时间戳
 *
 * @return uint32_t - 时间戳
 */
extern uint32_t RfidGetTimestamp(void);

/**
 * @brief 获取实时时间
 *
 * @param pYr - 年
 * @param pMt - 月
 * @param pDe - 日
 * @param pHr - 时
 * @param pMe - 分
 * @param pSd - 秒
 * @param pWk - 周
 */
extern void RfidGetTheCurrentTime(uint16_t *pYr, uint8_t *pMt, uint8_t *pDe, uint8_t *pHr, uint8_t *pMe, uint8_t *pSd, uint8_t *pWk);

/**
 * @brief 更新实时时间
 *
 * @param CurrectTime - 当前时间
 * @return bool - 更新状态（true：成功 false：失败）
 */
extern bool RfidUpdateRealTime(uint32_t CurrectTime);

/**
 * @brief 启动设备重置
 *
 */
extern void RfidStartDeviceFactorySetting(void);

/**
 * @brief 删除所有持卡人
 *
 */
extern void RfidDeleteAllCardholderInformation(void);

/**
 * @brief 清空所有日志
 *
 */
extern void RfidDeleteAllLoGInformation(void);

/**
 * @brief 获取读写数据长度
 *
 * @param pFirstPacketIn - 首包数据
 * @return uint16_t      - 读写数据长度
 */
extern uint16_t RfidGetRWDataLength(const uint8_t *pFirstPacketIn);

/**
 * @brief 验证虚拟卡有效性
 *
 * @param pCardSerialNumberIn - 虚拟卡号
 */
extern void RfidVerifyVirtualCardValidity(uint8_t *pCardSerialNumberIn);

/**
 * @brief 执行异或加密
 *
 * @param pKeyIn      - 密钥
 * @param KeyLength   - 密钥长度
 * @param pDataPacket - 输入输出数据
 * @param DataSize    - 数据长度
 */
extern void RfidCalXorEncrypt(uint8_t *pKeyIn, uint8_t KeyLength, uint8_t *pDataPacket, uint32_t DataSize);

/**
 * @brief 执行异或解密
 *
 * @param pKeyIn      - 密钥
 * @param KeyLength   - 密钥长度
 * @param pDataPacket - 输入输出数据
 * @param DataSize    - 数据长度
 */
extern void RfidCalXorDecrypt(uint8_t *pKeyIn, uint8_t KeyLength, uint8_t *pDataPacket, uint32_t DataSize);

/**
 * @brief 执行 DES 加密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void RfidCalDesEncrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 执行 DES 解密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void RfidCalDesDecrypt(const uint8_t *pKeyIn, const uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 执行 AES(ECB) 加密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void RfidAesEcbEncrypt(uint8_t *pKeyIn, uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 执行 AES(ECB) 解密
 *
 * @param pKeyIn   - 密钥
 * @param pDataIn  - 输入的数据
 * @param pDataOut - 输出的数据
 */
extern void RfidAesEcbDecrypt(uint8_t *pKeyIn, uint8_t *pDataIn, uint8_t *pDataOut);

/**
 * @brief 上报设备自检结果
 *
 * @param Result - 自检结果
 */
extern void RfidReportSelfTestResult(bool Result);

/**
 * @brief 上报卡片序列号
 *
 * @param pCardSerialNumberIn - 卡号
 * @return bool               - 上报状态（true：成功 false：失败）
 */
extern bool RfidReportedCardSerialNumber(uint8_t *pCardSerialNumberIn);

/**
 * @brief 上报卡片靠近
 *
 * @return bool - 上报状态（true：成功 false：失败）
 */
extern bool RfidReportedCardNearby(void);

/**
 * @brief 停止设备自检任务
 *
 */
extern void RfidStopSelfTestTask(void);

/**
 * @brief 延时启动设备自检任务
 *
 * @param Ms - 延时的时间
 */
extern void RFidDelayedStartSelfTestTask(uint32_t Ms);

/**
 * @brief 立即启动设备自检任务
 *
 */
extern void RfidStartSelfTestTaskNoWait(void);

/**
 * @brief 停止读取卡片数据任务
 *
 */
extern void RfidStopReadCardDataTask(void);

/**
 * @brief 延时启动读取卡片数据任务
 *
 * @param Ms - 延时的时间
 */
extern void RFidDelayedStartReadCardDataTask(uint32_t Ms);

/**
 * @brief 立即启动读取卡片数据任务
 *
 */
extern void RfidStartReadCardDataTaskNoWait(void);

/**
 * @brief 停止卡片数据更新任务
 *
 */
extern void RfidStopCardDataTask(void);

/**
 * @brief 延时启动卡数据更新任务
 *
 * @param Ms - 延时的时间
 */
extern void RFidDelayedStartCardDataUpdateTask(uint32_t Ms);

/**
 * @brief 立刻启动卡数据更新任务
 *
 */
extern void RfidStartCardDataUpdateTaskNoWait(void);

/**
 * @brief 设置读取卡片类型
 * 
 * @param ReadType 
 * @return true 
 * @return false 
 */
extern bool RfidSetReadTheCardType(uint8_t ReadType);

/**
 * @brief 获取读取卡片类型
 * 
 * @return uint8_t 
 */
extern uint8_t RfidGetReadTheCardType(void);

/**
 * @brief 获取电梯卡起始扇区号
 * 
 * @return uint8_t 
 */
extern uint8_t RfidGetElevatorStartSectorNumber(void);

/**
 * @brief 获取电梯卡扇区访问密钥
 * 
 * @param pKey 
 */
extern void RfidGetElevatorSectorAccessKey(uint8_t *pKey);

/**
 * @brief 初始化板载功能
 *
 * @param pExternFunctionTable - 外部调用方法表
 */
extern void RfidBoardInitialisation(RfidExternFunctionTable_t *pExternFunctionTable);

/**
 * @brief 停止读取卡片数据2任务
 * 
 */
extern void RfidStopReadCard2DataTask(void);

/**
 * @brief 延时启动读取卡片数据2任务
 * 
 * @param Ms 
 */
extern void RFidDelayedStartReadCardData2Task(uint32_t Ms);

/**
 * @brief 立即启动读取卡片数据2任务
 * 
 */
extern void RfidStartReadCardData2TaskNoWait(void);

/**
 * @brief 获取第三方类型
 * 
 * @return uint8_t 
 */
extern uint8_t RfidGetThirdPartyTypeOfReading(void);

/**
 * @brief  设置第三方类型
 * 
 * @param ThirdPartyTypeOfReading 
 * @return true 
 * @return false 
 */
extern bool RfidSetThirdPartyTypeOfReading(uint8_t ThirdPartyTypeOfReading);

#endif
#endif
